package com.ayz.gateway.core.authorization;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName JWTUtils
 * @Description TODO: JWT的工具类 用于生成TOKEN 和解码TOKEN
 * @Author 快乐的星球
 * @Date 2023/5/11 10:55
 * @Version 1.0
 **/
public class JWTUtils {

    public static String generateToken(String issuer, long ttlMills, Map<String,Object>
                                       claims,String singingKey){
        if(claims==null){
            claims=new HashMap<>();
        }
        //签发Token的时间戳
        long nowMills=System.currentTimeMillis();
        Date now=new Date(nowMills);
        JwtBuilder builder= Jwts.builder().setClaims(claims)
                .setIssuedAt(now)//签发时间
                .setSubject(issuer)//签发人
                .signWith(SignatureAlgorithm.HS256,singingKey);
        if(ttlMills>0){
            //设置过期时间
            long exeMills=nowMills+ttlMills;
            //过期时间,存放入JWT体中,载荷的非常重要的组成部分,如果当前Token已经过期了,解码的时候就会报错
            Date exe=new Date(exeMills);
            builder.setExpiration(exe);
        }
        return builder.compact();
    }

    public static Claims decode(String token,String singingKey){
        return Jwts.parser()
                //设置私钥 想解码必须知道私钥
                .setSigningKey(singingKey)
                .parseClaimsJws(token)
                .getBody();
    }
}
